package com.xncoding.aop.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.stream.Collectors;

/**
 * args(参数类型列表)
 * 匹配当前执行的方法传入的参数是否为args中指定的类型；
 * 注意是匹配传入的参数类型，不是匹配方法签名的参数类型；
 * 参数类型列表中的参数必须是类型全限定名，不支持通配符；
 * args属于动态切入点，也就是执行方法的时候进行判断的，
 * 这种切入点开销非常大，非特殊情况最好不要使用
 */
@Aspect
@Component
public class AopArgs {

    //@1：匹配只有1个参数其类型是String类型的
    @Pointcut("args(String)")
    public void pc00() {
    }

    //@1：匹配第二个个参数其类型是String类型的
    @Pointcut("args(*,String)")
    public void pc01() {
    }

    //@1：匹配最后1个参数其类型是String类型的
    @Pointcut("args(..,String)")
    public void pc02() {
    }

//    @Before("pc02()")
    public void beforeAdvice(JoinPoint joinpoint) {
        System.out.println("请求参数：" + Arrays.stream(joinpoint.getArgs()).collect(Collectors.toList()));
    }

}
